home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / IPDUMP.C < prev    next >
C/C++ Source or Header  |  1996-08-29  |  3KB  |  109 lines

  1. /* IP header tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. /* Mods by PA0GRI */
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "internet.h"
  8. #include "iface.h"
  9. #include "trace.h"
  10.  
  11. #if !defined(_lint)
  12. static char rcsid[] OPTIONAL = "$Id: ipdump.c,v 1.9 1996/08/29 12:11:16 root Exp root $";
  13. #endif
  14.  
  15. void
  16. ip_dump (fp, bpp, check)
  17. FILE *fp;
  18. struct mbuf **bpp;
  19. int check;
  20. {
  21. struct ip ip;
  22. int16 ip_len;
  23. int16 length;
  24. int16 csum;
  25.  
  26.     if (bpp == NULLBUFP || *bpp == NULLBUF)
  27.         return;
  28.  
  29.     traceprintf (fp, "IP:");
  30.     /* Sneak peek at IP header and find length */
  31.     ip_len = ((*bpp)->data[0] & 0xf) << 2;
  32.     if (ip_len != IPLEN) {
  33.         traceprintf (fp, " bad header\n");
  34.         return;
  35.     }
  36.     if (check)
  37.         csum = cksum (NULLHEADER, *bpp, ip_len);
  38.     else
  39.         csum = 0;
  40.  
  41.     (void) ntohip (&ip, bpp);    /* Can't fail, we've already checked ihl */
  42.  
  43.     /* check IP length */
  44.     if (ip.length < ip_len) {
  45.         traceprintf (fp, " bad header\n");
  46.         return;
  47.     }
  48.     /* Trim data segment if necessary. */
  49.     length = ip.length - ip_len;    /* Length of data portion */
  50.     trim_mbuf (bpp, length);
  51.     traceprintf (fp, " len %u", ip.length);
  52.     traceprintf (fp, " %s", inet_ntoa (ip.source));
  53.     traceprintf (fp, "->%s ihl %u ttl %u",
  54.              inet_ntoa (ip.dest), ip_len, uchar (ip.ttl));
  55.     if (ip.tos != 0)
  56.         traceprintf (fp, " tos %u", uchar (ip.tos));
  57.     if (ip.offset != 0 || ip.flags.mf)
  58.         traceprintf (fp, " id %u offs %u", ip.id, ip.offset);
  59.     if (ip.flags.congest)
  60.         traceprintf (fp, " CE");
  61.     if (ip.flags.df)
  62.         traceprintf (fp, " DF");
  63.     if (ip.flags.mf) {
  64.         traceprintf (fp, " MF");
  65.         check = 0;    /* Bypass host-level checksum verify */
  66.     }
  67.     if (csum != 0)
  68.         traceprintf (fp, " CHECKSUM ERROR (%u)", csum);
  69.  
  70.     if (ip.offset != 0) {
  71.         traceprintf (fp, "\n");
  72.         return;
  73.     }
  74.     switch (uchar (ip.protocol)) {
  75.         case TCP_PTCL:
  76.             traceprintf (fp, " prot TCP\n");
  77.             tcp_dump (fp, bpp, ip.source, ip.dest, check);
  78.             break;
  79.         case UDP_PTCL:
  80.             traceprintf (fp, " prot UDP\n");
  81.             udp_dump (fp, bpp, ip.source, ip.dest, check);
  82.             break;
  83.         case ICMP_PTCL:
  84.             traceprintf (fp, " prot ICMP\n");
  85.             icmp_dump (fp, bpp, ip.source, ip.dest, check);
  86.             break;
  87.         case ENCAP_PTCL:
  88.         case IP_PTCL:
  89.             traceprintf (fp, " prot IP(%d)\n", uchar (ip.protocol));
  90.             ip_dump (fp, bpp, check);
  91.             break;
  92. #ifdef AX25
  93.         case AX25_PTCL:
  94.             traceprintf (fp, " prot AX25\n");
  95.             ax25_dump (fp, bpp, check);
  96.             break;
  97. #endif
  98. #ifdef  RSPF
  99.         case RSPF_PTCL:
  100.             traceprintf (fp, " prot RSPF\n");
  101.             rspf_dump (fp, bpp, ip.source, ip.dest, check);
  102.             break;
  103. #endif
  104.         default:
  105.             traceprintf (fp, " prot %u\n", uchar (ip.protocol));
  106.             break;
  107.     }
  108. }
  109.